package JavaEE.ManyThread2;
import java.util.*;
//              (中断机制)                          (自定义标志位)
// 使用:JVM自带"isInterrupted"方法作为while循环条件 和 "自定义全局变量"作为while循环条件 的差别:
// 1.自定义标志位:普通邮件
//   你把信(标志位修改)投递到邮箱(内存)
//   收件人(目标线程)必须主动去检查邮箱
//   如果收件人在睡觉(阻塞),永远不会查邮件
// 2.中断机制:紧急广播系统
//   直接触发整个建筑的警报(中断信号)
//   即使线程在睡觉(sleep),等待(wait)或阻塞IO
//   都会立即被唤醒并收到InterruptedException
//
public class Demo2 {
    // 通过Thread内置变量终止线程
    public static void main(String[] args) throws InterruptedException{
        Scanner in = new Scanner(System.in);
        Thread thread = new Thread(() -> {
            while(!Thread.currentThread().isInterrupted()){
                try{
                    System.out.println(Thread.currentThread().getName() + " :我还活着");
                    // 当现成在sleep(),wait()等阻塞方法时,如果被interrupt():
                    // 1. 抛出InterruptedException(表示被中断唤醒)
                    // 2. 重置中断标志位(isInterrupted()还会返回false)
                    Thread.sleep(1000);
                }catch(InterruptedException e){
                    // 比如我正在打游戏,此时我妈让我去买酱油,我的选择:
                    // 1.立刻停止游戏,去买酱油 ↓
                    System.out.println("不玩啦!");
                    break;
                    // 2. 完全忽视,继续打游戏 ↓
                    // 啥也不干
                    // 3. 打完游戏,去买酱油 ↓
                    // doSomething()...
                }
            }
        });
        thread.start();
        System.out.println("请输入一些文字以终止线程");
        in.next();
        thread.interrupt();
    }
}
